// bind() 方法不会调用函数。但是能改变函数内部 this 指向。
// 语法 ： let fn = fun.bind(thisArg, arg1, arg2, ...)
/* 
thisArg：在 fun 函数运行时指定的 this 值
arg1，arg2：传递的其他参数
返回由指定的 this 值和初始化参数改造的 =>原函数拷贝
因此当我们只是想改变 this 指向，并且不想调用这个函数的时候，可以使用 bind
*/

let o = {
  name: 'red'
}

function fn(a) {
  console.log(this);
  console.log(a);
}
fn('green');
let f = fn.bind(o); //返回原函数的拷贝(改变了this的拷贝)
f('andy')

// 应用：比如在使用定时器函数时  定时器函数的内部this指向的是顶级对象 ，那么我们就可以用bind方法来改变this的指向


/* 总结 */
/* 
相同点：都可以改变函数内部的 this 指向
区别点:
call 和 apply 会调用函数, 并且改变函数内部this指向
call 和 apply 传递的参数不一样，call 传递参数 aru1, aru2.. 形式，apply 必须数组形式 [arg]
bind 不会调用函数，可以改变函数内部 this 指向，并返回一个原函数的拷贝


call()常用作构造函数的继承
apply()常用作数组有关的操作：最大值最小值
bind()只要不立即调用函数 就用bind()

*/